using System;
using System.Globalization;
using System.Linq;
using System.Runtime.CompilerServices;

namespace Lombiq.HelpfulLibraries.Common.Utilities;

/// <summary>
/// 将其他类型转换为字符串的实用函数。
/// </summary>
public static class StringHelper
{
    /// <summary>
    /// 将 <see cref="FormattableString"/> 实例转换为 <see cref="CultureInfo.InvariantCulture"/><see
    /// langword="string"/>，然后连接它们。
    /// </summary>
    /// <param name="formattableStrings">您可以直接在此处传递插值字符串。</param>
    public static string Concatenate(params FormattableString[] formattableStrings) =>
        Join(string.Empty, formattableStrings);

    /// <summary>
    /// 将 <see cref="FormattableString"/> 实例转换为 <see cref="CultureInfo.InvariantCulture"/><see
    /// langword="string"/>，然后使用 <paramref name="separator"/> 将它们连接在一起。
    /// </summary>
    /// <param name="separator">要在实例之间插入的文本。</param>
    /// <param name="formattableStrings">您可以直接在此处传递插值字符串。</param>
    public static string Join(string separator, params FormattableString[] formattableStrings) =>
        string.Join(
            separator,
            formattableStrings.Select(formattable => formattable.ToString(CultureInfo.InvariantCulture)));

    /// <summary>
    /// 将 <see cref="IConvertible"/> 实例（这包括大多数基元类型）转换为 <see
    /// cref="CultureInfo.InvariantCulture"/><see langword="string"/>，然后连接它们。
    /// </summary>
    public static string ConcatenateConvertiblesInvariant(params IConvertible[] convertibles) =>
        string.Join(
            string.Empty,
            convertibles.Select(formattable => formattable.ToString(CultureInfo.InvariantCulture)));

    /// <summary>
    /// 使用不变文化从插值字符串创建 <see langword="string"/>。这可以防止插值值的文化敏感格式。
    /// </summary>
    public static string CreateInvariant(this DefaultInterpolatedStringHandler value) =>
        string.Create(CultureInfo.InvariantCulture, ref value);
}
